特定のIAM Identity Centerユーザーのみ S3アクセスを許可するバケットポリシー
どうも、ちゃだいん(@chazuke4649)です。
特定のAWS IAM Identity Centerユーザーのみ S3アクセスを許可するバケットポリシーをご紹介します。
"特定のIAM Identity Center許可セット"の場合は、以下ブログをどうぞ。
前提
正確には、「特定のAWS IAM Identity Centerユーザー以外の S3アクセスを拒否するバケットポリシー」です。
また、そもそもユーザー側にS3のアクセスが許可されている状態を想定します。よって、バケットポリシーがない状態だと、ユーザー側に権限があればアクセスできる状態であり、それを一定条件を満たさないと拒否するようにリソース側で制御するイメージです。
結論
以下のようなバケットポリシーになります。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": "arn:aws:s3:::<S3バケット名>/*", "Condition": { "StringNotLike": { "aws:userId": "<IAMロールID>:<Identity Centerユーザー名>" } } } ] }
この二つのブログを大いに参考にしています。
ポイント
Condition
にて、aws:userId
に対し、許可したい 許可セットのIAMロールID x Identity Centerユーザー名 を記述します。
この値は、例えばそのIdentity Centerユーザーが使えれば、 aws sts get-caller-identity
で取得できます。
$ aws sts get-caller-identity { "UserId": "AROADUMMYDUMMYDUMMY:TestAdminUser", "Account": "000000000000", "Arn": "arn:aws:sts::000000000000:assumed-role/AWSReservedSSO_ReadOnlyAccess_exampleeeeeeeee/TestAdminUser" }
まさに、このUserIdのみ許可したいということであれば、先ほどのバケットポリシーに当てはめるとこうなります。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": "arn:aws:s3:::<S3バケット名>/*", "Condition": { "StringNotLike": { "aws:userId": "AROADUMMYDUMMYDUMMY:TestAdminUser" } } } ] }
Identity Centerユーザーによる認可の実体は、「許可セットによって生成されたIAMロールを引き受けたロールセッション」です。
つまり、「IAMユーザーがIAMロールにスイッチロールした時と同じようなもの」です。
ということは、リソースポリシーとしては、特定の Assumed-role session と同様の記述で制御が可能ということになります。
注意点
1点注意点としては、IAMロールIDは明示的に記述し、ワイルドカードを使わないことです。
つまり、さっきの例でいくと"aws:userId": "*:TestAdminUser"
としない方が良い場合があります。
というのも「Identity Centerユーザー名だけで絞ればいいんじゃない?」と思う人もいると思うのですが、もし利用者に元々適当なIAMユーザーとIAMロールを作る権限があれば、Identity Centerユーザーによるロールセッションを偽装できる可能性があります。
具体的には、とあるIdentity Centerユーザーの同じユーザー名のIAMユーザーを作成し、S3FullAccess
のあるIAMロールを作ってスイッチすれば、UserIdは、IAMロールID部分以外を除くとIdentity Centerユーザーのそれと見分けがつきません。
ただし、ロールIDは、IAMロールを一意に識別するIDなので偽装は困難です。さらに、適当なIAMユーザーが許可セットのIAMロールにスイッチすることは、信頼ポリシーにて許可されていないため、できません。
よって、許可セットのIAMロールID x Identity Centerユーザー名 に一致するロールセッションのみを対象とすることで、そういった偽装を防ぐことが可能です。
他参考情報
AWS グローバル条件コンテキストキー - AWS Identity and Access Management
AWS JSON ポリシーの要素: Principal - AWS Identity and Access Management
What is IAM Identity Center? - AWS IAM Identity Center (successor to AWS Single Sign-On)
IAM ID センターリソースへのアクセス許可の管理の概要 - AWS IAM Identity Center (successor to AWS Single Sign-On)
ちなみに、レアケースですがSCPにてIdentity Center ユーザーのユーザーID(※上で紹介したものとは別物なので注意)で制御するには、以下の方法もあります。